home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 07, No. 06 (1986-06)(MicroSPARC)(Side A).zip
/
Nibble Volume 07, No. 06 (1986-06)(MicroSPARC)(Side A).do
/
VORATIO.BIN.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
24KB
|
763 lines
********************************
* VORATIO.BIN *
* BY DARRELL FETZER *
* COPYRIGHT 1986 *
* BY MICROSPARC, INC. *
* CONCORD, MA 01742 *
* *
* MERLIN ASSEMBLER *
********************************
LIFLOC = $6E8
LEVLOC = $6F2
SCLOC = $6D9
KEYSTR = $C000
KEYCLR = $C010
GRAPHIC = $C050
TEXT = $C051
MIXED = $C053
PAGE1 = $C054
HIRES = $C057
RANDOM = $EFAE ;APPLESOFT RANDOM # ROUTINE
HOME = $FC58
WAIT = $FCA8
SLNGH = $6
DEPTH = $7
ADDLEN = $8
LENGTH = $9
GRBUFFL2 = $19
GRBUFFH2 = $1A
PRINTL = $1B
PRINTH = $1C
HDPTR = $1E
*** $1F = HIGH BYTE OF 16-POINTER
RNDL = $9F
RNDH = $A0
PITCH = $CE
TIME = $CF
R1 = $D6
*** $D7 = HIGH BYTE OF 16-COUNTER
DELTAX = $EB
DELTAY = $EC
VECL = $ED
VECH = $EE
SHIFTER = $EF
X = $F9 ;CURRENT X COORD OF HEAD
Y = $FA ;CURRENT Y COORD. OF HEAD
APCOUNT = $FB
GRBUFFL = $FC
GRBUFFH = $FD
XI = $FE ;X COORD. OF MOVEMENT VECTOR
YJ = $FF ;Y COORD. OF MOVEMENT VECTOR
WORM = $6000
VECPTRL = $6065
VECPTRR = $6066
VECTBL = $6067
TABL1 = $60C7
LINE = $60D4
TBL4 = $60F5
TBL5 = $60F9
LCOUNT = $60FD
SPEED = $60FE
MX = $60FF
SEGLOC = $6100
MUSH = $6200
APPLE = $6220
TBL1 = $624F
TBL2 = $630F
TBL3 = $63CF
XOFF = $648F
XBASE = $65A7
TABL2 = $66B8
TABL3 = $66C5
LEVEL1 = $66D2
TABLEL = $6984
TABLEH = $6997
********************************
ORG $69AA
*** DRAW BORDERS OF SCREEN AND
*** PUT INFO ON BOTTOM
PROG LDX #$00 ;START
DRAW LDY #$00 ;FILLS HIRES SCREEN SOLID WHITE
LDA TBL1,X
STA GRBUFFL
STA GRBUFFL2
LDA TBL2,X
STA GRBUFFH
LDA TBL3,X
STA GRBUFFH2
LDA #$7F
DRAW1 STA (GRBUFFL),Y
STA (GRBUFFL2),Y
INY
CPY #$28
BCC DRAW1
INX
CPX #$A3
BLT DRAW
LDX #$00
LUP3 LDY #$00 ;PUTS SCORE INFO ON THE BOTTOM OF THE TXT SCREEN
LDA TBL4,X
STA PRINTL
LDA TBL5,X
STA PRINTH
LUP1 LDA #$20
STA (PRINTL),Y
INY
CPY #$28
BNE LUP1
INX
CPX #$04
BNE LUP3
JSR PSCRN ;CLEARS THE MIDDLE OF THE SCREEN
BIT GRAPHIC
BIT HIRES
BIT PAGE1
BIT MIXED
LDA #>SCLOC
STA PRINTH
LDA #<SCLOC-6
STA PRINTL
LDX #$00
LDY #$00
LUP2 LDA LINE,X
STA (PRINTL),Y
INX
INY
CPY #$21
BLT LUP2
*** SETUP VARIABLES
LDA #$FF ;SET INTERNAL LEVEL COUNT TO -1
STA LCOUNT
LDA #>VECTBL
STA VECH
LDA #>SEGLOC
STA HDPTR+1
STA R1+1
LDA #<SEGLOC
STA R1
LDA #$F0 ;SET MINIMUM SPEED TO 240
STA MINSPD
LDA #$00 ;SET # OF POINTS FOR EATING APPLE TO BASE VALUE
STA POINT
*** OUTSIDE LOOP. PROGRAM COMES
*** HERE WHEN PLAYER MAKES NEW
*** LEVEL.
START1 INC LCOUNT ;ADVANCE TO NEXT LEVEL
LDA LCOUNT
LSR ;IF LEVEL IS ODD THEN POINTS PER APPLE INCREASES
BCS NO ;OTHERWISE STAYS THE SAME
INC POINT
NO LDA #$00 ;SET DEATH ON LEVEL COUNTER TO 0
STA DIE?
SEC ;INCREASE MINIMUM SPEED
LDA MINSPD
SBC #$05
STA SPEED ;SAVE IT
STA MINSPD
INC LEVLOC+1 ;UPDATE INFO ON THE TEXT SCREEN
LDA LEVLOC+1
CMP #':
BNE START
LDA #'0
STA LEVLOC+1
INC LEVLOC
LDA LEVLOC
CMP #'2 ;IF PLAYER MAKES IT TO LEVEL 20
BNE START
JMP EXIT ;RETURN TO BASIC
*** INSIDE LOOP. PLAYER COMES
*** HERE WHEN HE DIES.
START JSR PSCRN ;CLEAR WRECKAGE FROM SCREEN
JSR LEVELSET ;SET BARRICADES ON SCREEN
LDA MINSPD ;SET PLAYERS CURRENT SPEED
STA SPEED ;TO MINIMUM
LDA #$03 ;SET DIRECTION VECTOR TO 3,0
STA XI
LDA #$00
STA YJ
LDA VECTBL ;SET LINKED LIST POINTERS TO CORRESPOND
STA VECPTRL ;TO THE 3,0 INITIALIZATION
LDA VECTBL+3
STA VECPTRR
LDA #$0A ;SET THE # OF APPLES TO BE EATEN ON A LEVEL TO
STA APCOUNT ;TEN
LDA #$01 ;SET THE LENGTH OF THE WORM TO 1
STA LENGTH
LDA #$09 ;SET THE # OF SEGMENTS TO BE ADDED TO 9
STA ADDLEN
LDA #<SEGLOC ;SET THE HEAD POINTER TO THE TOP OF THE QUEUE
STA HDPTR
LDA #$15 ;SET INITIAL X COORD TO 15
LDY #$00
STA (HDPTR),Y ;SAVE ON QUEUE
STA X ;AND IN CURRENT HEAD POSITION
INY
LDA #$94 ;SET INITIAL Y COORD TO 148
STA (HDPTR),Y ;SAVE ON QUEUE
STA Y ;AND IN CURRENT HEAD POSITION
JSR SEGSET ;DRAW THE HEAD
JSR MSAFE ;DRAW A MUSHROOM IN A SAFE PLACE
JSR SAFE ;DRAW AN APPLE IN A SAFE PLACE
BIT KEYCLR ;CLEAR STROBE
LDA KEYSTR ;WAIT FOR A KEY PRESS (K.P.) TO START GAME
BPL *-3
*** ALL CONTROL OF WORM TAKES
*** PLACE IN THIS LOOP
WAIT1 LDA KEYSTR ;GET FIRST COMMAND
BPL NOKEY ;NO COMMAND ACT IN CURRENT DIRECTION
CMP #$9B ;ESCAPE
BNE KEY1 ;NO, TEST NEXT KEY
JMP EXIT ;EXIT TO BASIC
KEY1 CMP #$A0 ;SPACE
BNE KEY2 ;NO, GO TO NEXT TEST
BIT KEYCLR ;CLEAR STROBE
LDA KEYSTR ;WAIT FOR ANOTHER K.P. TO UNFREEZE GAME
BPL *-3 ;NO KEY
KEY2 CMP #"L ;WAS IT AN L
BNE KEY3 ;NOPE
BIT KEYCLR ;CLEAR STROBE
JMP START1 ;JMP TO SET UP FOR NEXT LEVEL
KEY3 JSR MOVMNT ;INTERPRET K.P. AS MOVEMENT COMMAND
NOKEY BIT KEYCLR ;CLEAR STROBE
JSR POSUPD ;UPDATE WORM'S POSITION
LDA COLL ;LOAD COLLISION COUNTER
BNE MOLIFE ;IF NONZERO COLLISION OCCURED
LDA SPEED ;OTHERWISE GET CURR. SPEED
JSR WAIT ;AND WAIT
LDA APCOUNT ;GET # OF APPLES LEFT OF ORIG. TEN
BNE NOTEN ;NONZERO # LEFT GO FOR MORE
LDA DIE? ;DONE WITH LEVEL. DID PLAYER DIE ON LEVEL EVER
BNE DIETEN ;NONZERO = YES AND NO BONUS
LDY #$0A ;NO DEATH IS REWARDED WITH 1000 PT. BONUS
MBONUS JSR SCORE1 ;ADD 100 TO SCORE
DEY
BNE MBONUS ;MORE SCORE TO GIVE IF NOT DONE WITH 1000 PTS
DIETEN JMP START1 ;GO TO NEXT LEVEL
NOTEN JMP WAIT1 ;GET ANOTHER K.P.
*** START OF SUBROUTINES
MOLIFE LDA #$20 ;SET UP FOR THE DEATH SOUND
STA PITCH
LDA #$00
STA EPITCH
LDA #$03
STA TIME1
JSR SOUND
LDX LIFLOC
DEX ;DECREASE THE NUMBER OF LIVES THE PLAYER HAS
CPX #'/ ;IS IT LESS THAN ZERO
BEQ EXIT ;IF YES THAN THE GAME IS OVER
STX LIFLOC ;OTHERWISE SAVE HIS CURRENT # OF LIVES ON SCRN.
LDA KEYSTR ;WAIT FOR K.P.
BPL *-3
INC DIE? ;INCREMENT DEATH ON LEVEL COUNTER (NO BONUS)
JMP START ;ERASE SCREEN AND START LEVEL AGAIN
EXIT BIT KEYCLR
JSR HOME ;CLEAR TEXT SCREEN
LDA TEXT ;TEXT DISPLAY
RTS ;RETURN TO BASIC
*** MOVEMENT ROUTINE INTERPRETS
*** KEYSTROKE AND GETS THE PROPER
*** VALUE FROM THE LINKED LIST
MOVMNT CMP #"J ;IS K.P. A J
BNE NEXT ;NO TRY ANOTHER TEST
LDA VECPTRL ;J MEANS LEFT SO GET LEFT POINTER FOR LINKED LIST
STA VECL ;AND SAVE IT
LDY #$00
LDA (VECL),Y ;LOAD NEX LEFT POINTER FROM LINKED LIST
STA VECPTRL ;SAVE IN LEFT POINTER
INY
LDA (VECL),Y ;GET X COORD OF DIRECTION VECTOR
STA XI ;SAVE IN X COORD OF MOVEMENT VECTOR
INY
LDA (VECL),Y ;GET Y COORD.
STA YJ ;AND SAVE
INY
LDA (VECL),Y ;GET NEW RIGHT POINTER FOR L.L.
STA VECPTRR ;SAVE IT
BCC OVER ;BRANCH ALWAYS BECAUSE K.P. WAS "J"
NEXT CMP #"K
BNE NEXT2 ;NOT A K TRY ANOTHER TEST
LDA VECPTRR ;K IS RIGHT SO GET RIGHT POINTER FOR L.L.
STA VECL ;SAVE FOR INDIRECT ADDRESSING
LDY #$00
LDA (VECL),Y ;GET NEW LEFT L.L. POINTER
STA VECPTRL
INY
LDA (VECL),Y ;GET X COORD
STA XI
INY
LDA (VECL),Y ;Y COORD
STA YJ
INY
LDA (VECL),Y ;NEW RIGHT POINTER
STA VECPTRR
BCC OVER ;BRANCH ALWAYS
NEXT2 CMP #"F ;WAS K.P. AN F
BNE NEXT3 ;TRY ANOTHER
LDA SPEED ;GET CURRENT SPEED
CMP #$10 ;IS IT AT A MAX.
BLT OVER ;YES SO IGNORE COMMAND
SEC
SBC #$0A ;INCREASE SPEED BY TEN
STA SPEED
BCC OVER ;BRANCH ALWAYS
NEXT3 CMP #"D ;IS K.P. A D
BNE OVER ;NOPE SO K.P. WAS MEANINGLESS
LDA SPEED ;GET CURRENT SPEED
CMP MINSPD ;IS IT AT A MIN.
BGE OVER ;YES, IGNORE COMMAND
CLC
ADC #$0A ;OTHERWISE DECREASE SPEED BY 10
STA SPEED
OVER RTS ;GET OUT OF HERE
*** POSITION UPDATE. UPDATES THE
*** POSITION OF THE WORM IN
*** ACCORD WITH DATA FROM MOVEMENT
*** OR IF NO KEY WAS PRESSED, WORM
*** CONTINUES WITH CURRENT PATH
POSUPD LDA ADDLEN ;GET # OF SEGMENTS TO ADD TO BACK OF WORM
CMP #$00 ;= 0 SO GOTO QUEUE UPDATE
BEQ EQUAL
BGE GREATER ;>0 SO ADD SEGMENTS TO BACK
EQUAL LDY #$00
LDA (R1),Y ;GET TOP VALUE FROM QUEUE
STA X ;SAVE FOR ERASE SUBROUTINE
INY
LDA (R1),Y ;GET NEXT VALUE
STA Y
JSR SEGCLR ;CLEAR SEGMENT FROM THE BACK OF THE WORM
LDY #$00
LDX LENGTH ;GET CURRENT LENGTH
DEX ;AND DECREASE BY TWO SINCE A SEGMENT WAS ERASED
*** MAINTAINS QUEUE WHICH KEEPS
*** TRACK OF ALL THE DIFFERENT
*** POSITIONS THE WORM HAS BEEN IN
QUEUE LDA SEGLOC+2,Y ;LOAD 3RD,Y AND
STA SEGLOC,Y ;STORE IT AT 0,Y POSITION IN THE QUEUE
INY
LDA SEGLOC+2,Y ;GET 3RD,Y AND
STA SEGLOC,Y ;STORE IT AT 1ST,Y POSITION OF QUEUE
INY
DEX ;X REG CONTAINS LENGTH OF WORM TO DECREASE
BNE QUEUE ;DONE WITH ALL SEGMENTS OF WORM IF <>0 THEN NO
CLC
BCC LESSER ;BRANCH ALWAYS
GREATER DEC ADDLEN ;DEC # OF SEGMENTS TO ADD
INC LENGTH ;INC LENGTH OF WORM
INC HDPTR ;ADD TWO TO QUEUE HEAD POINTER
INC HDPTR
LESSER LDY #$00
DEC HDPTR ;SUBTRACT TWO FROM HEAD POINTER
DEC HDPTR
LDA (HDPTR),Y ;GET COORD OF SEGMENT BEHIND THE CURRENT HEAD
STA X ;SAVE THEM
PHA ; AND PUSH THEM ONTO STACK FOR LATER USE
INC HDPTR
LDA (HDPTR),Y ;GET Y COORD AND
STA Y ;SAVE AND
PHA ;PUSH IT ALSO
INC HDPTR
LDA #$EA ;NOP ERASING THE HEAD ON HIRES 1
STA DEL
STA DEL+1
STA DEL1
STA DEL1+1
JSR SEGCLR ;ERASE SEGMENT ON PAGE 2
LDY #$00
CLC
LDA X ;GET CURRENT HEAD POS
ADC XI ;AND ADD X DIREC. VECTOR
STA X ;SAVE IT
STA (HDPTR),Y ;PUT ON THE BACK OF THE QUEUE
INY
CLC
LDA Y ;GET CURR. Y
ADC YJ ;ADD Y DIR. VECTOR
STA Y ;SAVE AND
STA (HDPTR),Y ;PUT ON BACK OF QUEUE
JSR SEGTST ;TEST IF NEW HEAD WILL HIT ANYTHING
LDA COLL ;GET COLLISION COUNTER
BEQ NOCOLL ;EQUALS ZERO THAT'S GOOD
JSR MORE1 ;ERASE THE APPLE AT ITS CURR. POSITION
JSR SEGTST ;TEST NEW HEAD AGAIN
LDA COLL ;TRY THE COLL. COUNTER AGAIN
BNE DEAD ;NONZERO THIS TIME AND YOU DIE
LDY POINT ;FIND OUT HOW MANY POINTS THE APPLE IS WORTH
SCORUP JSR SCORE ;AND UPDATE THE SCORE ACCORDINGLY
DEY
BNE SCORUP
LDA #$60 ;SET UP FOR NOISE FOR HITTING APPLE
STA PITCH
LDA #$64
STA EPITCH
LDA #$03
STA TIME1
JSR SOUND
DEC APCOUNT ;ONE LESS APPLE TO EAT
BNE ADDL ;DONE WITH ALL TEN YET
CLC
BCC NOCOLL ;SKIP OVER DIE ROUTINE
ADDL JSR MSAFE ;DRAW NEW MUSHROOM
JSR SAFE ;DRAW NEW APPLE
CLC
LDA ADDLEN ;ADD 5 SEGMENTS TO WORM
ADC #$05
STA ADDLEN
CLC
BCC NOCOLL ;SKIP DIE SEQUENCE
DEAD JSR MORE1 ;REDRAW APPLE SINCE IT DID NOT CAUSE COLLISION
NOCOLL LDA #$91 ;RESTORE SEGMENT ROUTINE TO NORMAL AFTER NOPS
STA DEL
STA DEL1
LDA #GRBUFFL
STA DEL+1
STA DEL1+1
JSR SEGSET ;FINALLY DRAW THE NEW HEAD
PLA ;GET COORD. OF HEAD SEGMENT THAT WAS ERASED
STA Y ;AND REDAW IT.
PLA
STA X
JSR SEGSET
*** SEGSET,SEGCLR AND SEGTST
*** DO ALL OPERATIONS ON THE
*** WORM ITSELF.
SEGSET JSR SSETUP ;GET PROPER SHIFTED SHAPE
SDRAW LDY DELTAY ;GET CURRENT Y OFFSET
JSR XYCALC ;CALCULATE MEMORY ADDRESS FOR HEAD
LDY #$00
LDA WORM,X ;GET WORM'S SHAPE FROM TABLE
ORA (GRBUFFL2),Y ;USE ORA FOR OVERLAPPING SEGMENTS
STA (GRBUFFL),Y ;STORE ON PAGE 1
STA (GRBUFFL2),Y ;AND ON PAGE 2
INY
INX
LDA WORM,X ;SAME AS ABOVE SINCE THE WORM IS TWO BYTES WIDE
ORA (GRBUFFL2),Y
STA (GRBUFFL),Y
STA (GRBUFFL2),Y
INX
INY
INC DELTAY ;GO TO NEXT LINE ON SCREEN
DEC DEPTH ;DONE WITH SHAPE YET?
BNE SDRAW ;NO KEEP DOING MORE
RTS
SEGTST LDA #$00 ;INITIALIZE COLLISION COUNTER
STA COLL
JSR SSETUP ;GET SHIFTED SHAPE
STST LDY DELTAY
JSR XYCALC ;CALCULATE MEMORY ADDRESS
LDY #$00
LDA WORM,X
AND (GRBUFFL2),Y ;TEST PAGE TWO FOR COLLISIONS
BEQ SKIP ;NONE GO ON
INC COLL ;HIT SOMETHING INCREASE COLL
SKIP INX
INY
LDA WORM,X
AND (GRBUFFL2),Y ;DO THE SAME FOR THE SECOND BYTE OF WORM
BEQ SKIP1
INC COLL
SKIP1 INX
INC DELTAY
DEC DEPTH
BNE STST
RTS
SEGCLR JSR SSETUP ;CALCULATE OFFSET
SCLR LDY DELTAY
JSR XYCALC
LDY #$00
LDA WORM,X
EOR #$FF ;COMPLEMENT WORM'S SHAPE
AND (GRBUFFL),Y ;TO SIMULTATE A BIT CLEAR ROUTINE.
DEL STA (GRBUFFL),Y ;A BIC OPCODE ON SOME MACHINES (PDP-11)
STA (GRBUFFL2),Y ;EOR CAN NOT BE USED TO ERASE SHAPES BECAUSE
INY ;OF THE OVERLAP IN THE SHAPES
INX
LDA WORM,X
EOR #$FF
AND (GRBUFFL),Y
DEL1 STA (GRBUFFL),Y
STA (GRBUFFL2),Y
INY
INX
INC DELTAY
DEC DEPTH
BNE SCLR
RTS
SSETUP LDX X ;GET COORD. THAT WERE PASSED IN X,Y REG.
LDY Y
LDA XBASE,X ;GET THE BYTE OFFSET FROM TABLE
STA DELTAX
LDA XOFF,X ;GET THE BIT OFFSET FOR THE SHAPE
TAX
STY DELTAY ;STORE ABSOLUTE Y COORD.
LDA #$07
STA DEPTH
RTS
XYCALC LDA TBL1,Y ;READS ADDRESS TABLES.
CLC
ADC DELTAX
STA GRBUFFL
STA GRBUFFL2
LDA TBL2,Y
STA GRBUFFH
LDA TBL3,Y
STA GRBUFFH2
RTS
*** SHAPESET DRAWS EITHER A MUSH-
*** ROOM OR AN APPLE DEPENDING
*** ON THE ADDRESS AT SHAPEL &
*** SHAPEH. WORKS THE SAME AS THE
*** OTHER SHAPE DRAWING ROUTINE
SHAPESET JSR SHSETUP
SHDRAW LDY DELTAY
JSR XYCALC
LDY #$00
SHDRAW2 INX
NAME LDA MUSH,X
EOR (GRBUFFL2),Y
STA (GRBUFFL),Y
STA (GRBUFFL2),Y
INY
CPY SLNGH
BNE SHDRAW2
INC DELTAY
CPX DEPTH
BLT SHDRAW
RTS
SHSETUP STX DELTAX
STY DELTAY
LDX #$00
NAME1 LDA MUSH,X
STA SLNGH
INX
NAME3 LDA MUSH,X
STA DEPTH
RTS
SHTEST LDA #$00 ;TEST TO SEE WHETHER THE SHAPE WILL BE
STA AMCOLL ;PLOTTED ON TOP OF SOMETHING ELSE
JSR SHSETUP ;IF IT IS SAFE THEN AMCOLL RETURNS A ZERO
SHTEST1 LDY DELTAY ;OTHERWISE IT IS NONZERO
JSR XYCALC
LDY #$00
SHTEST2 INX
NAME2 LDA MUSH,X
AND (GRBUFFL),Y
BEQ SKIP2
INC AMCOLL
SKIP2 INY
CPY SLNGH
BNE SHTEST2
INC DELTAY
CPX #$2B
BLT SHTEST1
RTS
*** MSAFE & SAFE FIND A PLACE
*** ON THE SCREEN FOR THE MUSH-
*** ROOMS AND APPLES THAT IS NOT
*** ALREADY OCCUPIED
MSAFE JSR RANDOM ;CALLS APPLESOFT RANDOM ROUTINE
LDA RNDL ;GET RND #
AND #$1F ;MASKS OUT TOP FOUR BITS
CLC
ADC #$04 ;ADDS FOUR TO GIVE A VALUE BETWEEN 4 AND 20
STA MX ;SAVE IN X COORD. FOR SHAPE
TAX
LDA RNDH ;GETS OTHER RND #
AND #$7F ;MASKS OUT HIGH BIT
CLC ;ADDS 10
ADC #$0A ; TO GIVE A VALUE BETWEEN 10 AND 138
STA MY ;SAVE IN Y COORD
TAY
LDA #<MUSH ;INSTUCT DRAW ROUTINE THAT IT IS TO
STA NAME+1 ;DRAW A MUSHROOM
STA NAME1+1
STA NAME2+1
STA NAME3+1
JSR SHTEST ;TEST SHAPE AREA
LDA AMCOLL ;IS THERE A COLLISION
BEQ MORE ;NO THEN GO ON
CLC
BCC MSAFE ;YES, GET NEW COORD. AND TRY AGAIN
MORE LDX MX ;GET (X,Y) OF MUSHROOM
LDY MY
JSR SHAPESET ;AND DRAW IT
RTS
SAFE JSR RANDOM ;SAFE WORKS THE SAME AS THE MSAFE ROUTINE
LDA RNDL ;EXCEPT THAT THE RANDOM X IS ALWAYS AN EVEN #
AND #$1E ;FOR A POSSIBLE COLOR APPLE AS A MODIFICATION
CLC
ADC #$04
CMP AX
BEQ SAFE
STA AX
TAX
LDA RNDH
AND #$7F
CLC
ADC #$0A
STA AY
TAY
LDA #<APPLE
STA NAME+1
STA NAME1+1
STA NAME2+1
STA NAME3+1
JSR SHTEST
LDA AMCOLL
BEQ MORE1
CLC
BCC SAFE
MORE1 LDX AX
LDY AY
JSR SHAPESET
RTS
*** PARTIAL SCREEN CLEARS THE
*** MIDDLE OF THE SCREEN. IT IS
*** USED BETWEEN LEVELS.
PSCRN LDX #$07 ;START SEVEN LINES DOWN BECAUSE OF THE BORDER
NXTLIN LDA TBL1,X
STA GRBUFFL
STA GRBUFFL2
LDA TBL2,X
STA GRBUFFH
LDA TBL3,X
STA GRBUFFH2
LDY #$02 ;START TWO BYTES OVER IN THE X DIREC. AGAIN BORD.
NDONE LDA #$00 ;STORE ZEROS TO CLEAR
STA (GRBUFFL),Y
STA (GRBUFFL2),Y
INY
CPY #$26 ;UNTIL THE 38TH BYTE. LEAVES 2 BYTE BORDER
BNE NDONE
INX
CPX #$A0
BNE NXTLIN
RTS
*** LEVELSET SETS UP THE LEVEL
*** ACCORDING TO THE TEMPLATES
*** LEVEL1,LEVEL2 ETC. IN THE
*** THE TEMPLATES, IF A BIT IS
*** ON THEN A BLOCK 7X7 PIXELS
*** WILL BE DRAWN AT THAT
*** LOCATION.
LEVELSET LDY LCOUNT ;GET CURRENT LEVEL
LDA TABLEL,Y ;GET ADDRESS OF CURRENT LEVEL TEMPLATE
STA NODONE1+1
LDA TABLEH,Y
STA NODONE1+2
LDY #$00
STY COUNT
STY VERT
LDA #$03 ;THREE BYTES MAKE ONE ROW (24 BITS)
STA FINISH1
NODONE3 LDX VERT ;GET STARTING ADDRESS FROM ABBREV. LOOKUP TAB.
LDA TABL1,X
STA GRBUFFL
STA GRBUFFL2
LDA TABL2,X
STA GRBUFFH
LDA TABL3,X
STA GRBUFFH2
CLC
ADC #$20 ;H BYTE OF ADDRESS TO STOP AT
STA FINISH
NODONE2 LDX COUNT
LDY #$00
NODONE1 LDA LEVEL1,X ;GET BYTES OF TEMPLATE
STA SHIFTER
LDA #$08 ;EIGHT BITS IN A BYTE
STA POS
NODONE ASL SHIFTER ;SHIFT BITS INTO CARRY FLAG THEN TEST TO SEE
BCC ZERO ;IF BITS ARE SET. IF NOT THE BRANCH
LDA #$7F ;OTHERWISE FILL THE BYTE ON SCREEN
STA (GRBUFFL),Y
STA (GRBUFFL2),Y
ZERO INY ;GO ON TO NEXT BIT
DEC POS ;DONE WITH ALL EIGHT YET?
BNE NODONE ;NO THEN GO FINISH
INX ;DONE WITH THREE BYTES YET
CPX FINISH1 ;NO THEN GO DO THAT
BNE NODONE1
CLC
LDA GRBUFFH ;CALCULATE NEXT HIRES ADDRESS RATHER THAN
ADC #$04 ;LOOKING UP
STA GRBUFFH
CMP FINISH ;COMPARE TO FINISHING ADDRESS
BNE NODONE2 ;NOT DONE YET DO MORE
LDA FINISH1 ;STORE OLD FINISH MARKER IN COUNT
STA COUNT
CLC
ADC #$03 ;UPDATE FINISH MARKER BY THREES TO KEEP TRACK
STA FINISH1 ;OF THE END OF ROWS
INC VERT ;NEXT LINE
LDA VERT
CMP #$0C ;DONE WITH ALL TWELVE YET?
BNE NODONE3 ;NO THEN GO BACK
RTS
SCORE1 LDA #$40 ;SET UP SOUND ROUTINE
STA PITCH ;FOR A BONUS SCORE
LDA #$44
STA EPITCH
LDA #$10
STA TIME1
STY TEMP
JSR SOUND
LDY TEMP
LDA #$A0
JSR WAIT
SCORE LDX #$03
MOSCO INC SCLOC,X ;KEEP SCORE DIRECTLY ON THE SCREEN BY
LDA SCLOC,X ;INCREMENTING SCREEN LOCATIONS
CMP #':
BNE MORSC
LDA #'0
STA SCLOC,X
DEX
CPX #$01 ;IF THE PLAYER GETS 10000 PTS
BNE MOSCO
INC LIFLOC ;GIVE HIM ANOTHER LIFE
CLC
BCC MOSCO
MORSC RTS
*** SOUND IS THE GENERAL PURPOSE
*** SOUND ROUTINE THAT GENERATES
*** A TONE OR SERIES OF TONES
*** DEPENDING ON THE VALUES OF
*** PITCH,TIME AND EPITCH (END-
*** PITCH)
SOUND LDA TIME1
STA TIME
SOUND1 LDX PITCH
LDA $C030
SOUND2 DEY
BNE SOUND3
DEC TIME
BEQ TEST
SOUND3 DEX
BNE SOUND2
BEQ SOUND1
TEST LDA PITCH
CLC
ADC #$04
STA PITCH
CMP EPITCH
BNE SOUND
RTS
MY HEX 00
MINSPD HEX 00
AMCOLL HEX 00
POS HEX 00
COUNT HEX 00
FINISH HEX 00
VERT HEX 00
AX HEX 00
AY HEX 00
COLL HEX 00
TEMP HEX 00
DIE? HEX 00
EPITCH HEX 00
TIME1 HEX 00
POINT HEX 00
FINISH1 HEX 00